package com.ww.java8.optional;

import java.util.Optional;

public class ValueFromOptional {

	@SuppressWarnings("unused")
	public static void main(String[] args) {
		/**
		 * Optional提供了一个map方法
		 */
		Insurance insurance = new Insurance();
		
		Optional<Insurance> optInsurance = Optional.ofNullable(insurance);
		
		/**
		 * map操作会将提供的函数应用于流的每个元素。你可以把Optional对象看成一种特殊的集合数据，
		 * 它至多包含一个元素。
		 * 如果Optional包含一个值，那函数就将该值作为参数传递给map，对该值进行转换。
		 * 如果Optional为空，就什么也不做
		 */
		Optional<String> name = optInsurance.map(Insurance::getName);
		
		/**
		 * flatMap
		 */
		
		
		/**
		 * 1、get()是这些方法中最简单但又最不安全的方法。如果变量存在，那么它直接返回封装的变量值，否则
		 * 就抛出一个NoSuchElementException异常
		 */
		
		/**
		 * 2、orElse(T other)，允许你在Optional对象不包含值时提供一个默认值
		 */
		
		/**
		 * 3、orElseGet()是orElse方法的延迟调用版，因为Supplier方法只有在Optional对象不含值时才执行调用。
		 * 如果创建默认值是件耗时费力的工作，你应该考虑采用这种方式（借此提升程序的性能）
		 */
		
		
	}
	
	public static String getCarInsuranceName(Optional<Person> person) {
		return person.flatMap(Person::getCar)
			.flatMap(Car::getInsurance)
			.map(Insurance::getName)
			.orElse("Unknown");
	}
}
